#ifndef CALLBACKS_H
#define CALLBACKS_H

/**
 * \file Callbacks.h
 * \brief Fonctions Callbacks Glut
 *
 */


class Image;
class Masque;
class vecteur;
class Matrice;

/*! \class Callbacks
* \brief classe representant les callbacks glut
*
*  La classe traite les interactions principales du programme.
*/
class Callbacks{

public:
 /*!
 *  \brief Redimension de la fenetre
 *
 *  Methode qui est appelée lors de la redimension de la fenetre
 *
 *  \param largeur : largeur de la fenetre
 *  \param hauteur : hauteur de la fenetre
 *  \return void
 */
	static void redim(int largeur, int hauteur);
/*!
 *  \brief Cliques souris
 *
 *  Methode qui est appelée lors d'un clique de la souris
 *
 *  \param bouton : bouton droit/gauche/millieu...
 *  \param etat : cliqué/relaché
 *  \param x : coordonnées en x du clique
 *  \param y : coordonnées en y du clique
 *  \return void
 */
	static void souris (int bouton, int etat, int x, int y);
/*!
 *  \brief Affichage des elements
 *
 *  Methode qui est appelée à chaque rendu OpenGl, c'est elle qui défini ce qui est affiché a l'écran
 *
 *  \return void
 */
	static void affichage(void);
/*!
 *  \brief Entrées clavier
 *
 *  Methode qui est appelée lors d'une entrée clavier
 *
 *  \param key : touche appuyé
 *  \param x : coordonnées en x de la souris lors de la pression de la touche
 *  \param y : coordonnées en y de la souris lors de la pression de la touche
 *  \return void
 */
	static void clavier ( unsigned char key, int x, int y);
/*!
 *  \brief Mouvement Actif
 *
 *  Methode qui est appelée lors d'un mouvement de la souris et lorsque un bouton est enfoncé
 *
 *  \param x : coordonnées en x de la souris
 *  \param y : coordonnées en y de la souris
 *  \return void
 */
	static void mouvement(int x,int y);
/*!
 *  \brief Mouvement Passif
 *
 *  Methode qui est appelée lors d'un mouvement de la souris et lorsque un bouton est relaché
 *
 *  \param x : coordonnées en x de la souris
 *  \param y : coordonnées en y de la souris
 *  \return void
 */
	static void mouvementPassif(int x,int y);
/*!
 *  \brief Opération initiale sur les images
 *
 *  Methode qui est appelée au tout début pour effectuer les initialisations sur les images et le masque
 *
 *  \return void
 */
	static void traitementInit();
/*!
 *  \brief Opération sur les images
 *
 *  Methode qui est appelée pour lancer l'algorithme
 *
 *  \return void
 */
	static void traitement();	
/*!
 *  \brief Initialisation OpenGL
 *
 *  Methode qui Initialise les etats d'OpenGL
 *
 *  \return void
 */
	static void initGL();
/*!
 * 
 * \brief Algorithme Simple
 * 
 * Methode qui permet d'inpainter grâce à une EDP
 *  \return void
 * 
 */
	static void algoSimple();

/*!
 * 
 * \brief Algorithme Bertalmio
 * 
 * Methode qui permet d'inpainter grâce aux isophotes
 *  \return void
 * 
 */
	static void algoPapier();

	
	
	static int hauteur;/*!< Hauteur de la fenetre*/
	static int largeur;/*!< Largeur de la fenetre*/
	static int MousePrevX;/*!< Position en X de la souris au rendu précédent*/
	static int MousePrevY;/*!< Position en Y de la souris au rendu précédent*/
	static Image* im;/*!< Image à charger*/
	static Image* u;/*!< Image à l'iteration u*/
	static Image* u1;/*!< Image à l'iteration u+1*/
	static Image* gradienX;/*!< Gradient de l'image en X*/
	static Image* gradienY;/*!< Gradient de l'image en Y*/
	static Image* laplacien;/*!< Laplacien de l'image chargée*/
	static Image* laplacienU;/*!< Laplacien de l'image a l'itération u*/
	static Masque* m;/*!< Masque à Inpainter*/
	static Matrice* hessienne;/*!< Matrice hessienne*/
	static int modeDessin ; /*!< Dessine/efface le masque en fonction du clique droit/gauche*/


};
#endif
